package 字符流;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class demo1 {
    public static void main(String[] args) throws IOException {
        Reader reader=new FileReader("D:\\abcd.txt");
        //创建Reader对象的过程就是打开文件
        //文件若不存在就会打开异常
        /*reader.read();//读取
        while(true){
            int c=reader.read();
            if (c==-1){
                break;
            }
            char ch=(char)c;
            System.out.println(ch);
        }*/

        //这给read会尽可能的把cbuf这个数组填满
        //如果实际上文件的内容填不满，也没关系，就直接把所有数据读出来就好了
        //如果文件内容超出数组范围，则可以进行循环
        /*while (true){
            char[] cbuf=new char[1024];
            int n=reader.read(cbuf);//表示实际读到字符的个数
            if(n==-1){
                break;
            }
            System.out.println("n="+n);
            for (int i = 0; i < n; i++) {
                System.out.print(cbuf[i]);
            }
        }*/
        try {
            while (true){
                char[] cbuf=new char[3];
                int n=reader.read(cbuf);//表示实际读到字符的个数
                if(n==-1){
                    break;
                }
                System.out.println("n="+n);
                for (int i = 0; i < n; i++) {
                    System.out.print(cbuf[i]);
                }
            }
        }finally {
            reader.close();
        }



        //这样写，仍然有文件资源泄露的风险，一旦上面哪个地方抛出异常就执行不到close-->finally,不够优雅-->看demo2
        //目的是为了释放文件描述符（顺序表一样的结构-数组）
        //一个进程每次打开一个文件，就需要在这个表里，分配一个元素，这个数组的长度是存在上限的
        //如果你的代码，一直打开文件而不去关闭文件，就会使这个表里的元素越来越多，直到数组被占满，后续再尝试打开文件就会出错了
        //文件资源泄露，类似于内存泄漏（malloc了没有free）
        //但是java中右GC，不需要手动释放；但文件还是需要手动释放的
        //文件资源泄露不影响你程序的功能（在文件描述表泄露完毕之前，你的程序一切正常）
        //不会立即暴露出来，而是在一定时间之后，突然引爆
        //若不及时发现，此时就可能引起生产环境的所有机器一起宕机
        //PCB包含很多的属性：pid、内存指针、文件描述符表

    }
}



























